/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufpb.projetoesa.negocio;


import br.ufpb.projetoesa.exceptions.ProjetoInexistenteException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Rennan
 */
public class Professor implements Serializable{
    
    
    private String nome;
    private String matricula;
    private String telefone;
    private List<Projeto> projetos;
            
    
    public Professor(String _nome, String _mat){
        this(_nome, _mat, "*");
    }
    
    public Professor(String _nome, String _mat, String _tel){
        this.nome = _nome;
        this.matricula = _mat;
        this.telefone = _tel;
        this.projetos = new ArrayList<Projeto>();
    }
     public Professor(){
        this.nome = "";
        this.matricula = "";
        this.telefone = "";
     }
    /**
     * 
     * @return Matrícula do professor.
     */
    public String getMatricula() {
        return matricula;
    }
    /**
     * 
     * @param matricula Matrícula do Professor.
     */
    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }
 
    /**
     * 
     * @return Nome do professor.
     */
    public String getNome() {
        return nome;
    }
    /**
     * 
     * @param nome Nome do professor.
     */
    public void setNome(String nome) {
        this.nome = nome;
    }
    /**
     * 
     * @return Telefone do professor.
     */
    public String getTelefone() {
        return telefone;
    }
    /**
     * 
     * @param telefone Telefone do professor.
     */
    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }
    
     /**
     * Adiciona um projeto ao professor.
     * @param proj Projeto a ser adicionado. 
     */
    public void addProjeto(Projeto proj) {
        this.projetos.add(proj);
    }
    
    /**
     * 
     * @return Retorna a lista de projetos do Professor.
     */
     public List<Projeto> getProjetos() {
        return this.projetos;
    }
     
     /**
      * Retorna Projeto com o nome passado por parametro caso ele exista, se o Projeto não
      * existir lança a exceção de ProjetoInexistente
      * @param String com o nome do Projeto
      * @return Projeto encontrado
      */
     public Projeto getProjeto(String _nome) throws ProjetoInexistenteException{
         for(Projeto p : this.projetos){
             if(p.getNome().equals(_nome))
                 return p;
         }
         throw new ProjetoInexistenteException("Nao ha nenhum projeto com este nome cadastrado a este professor.");
     }
     
     /*
      * @param String com o nome do projeto
      * @return Lista dos projetos encontrados
      * Retorna uma lista com os projetos que contem a string passada por parametro em seu nome
      */
      public List<Projeto> pesquisarProjetos(String nome) throws ProjetoInexistenteException {
        System.out.println("nome = " + nome);
        List<Projeto> resultado = new ArrayList<Projeto>();
        for(Projeto p: projetos){
            System.out.println("p.getNome() = " + p.getNome());
            if (p.getNome().toUpperCase().startsWith(nome.toUpperCase())){
                resultado.add(p);
            }
        }
        if (resultado.size()!=0){
            return resultado;
        } else {
            throw new ProjetoInexistenteException("Nao ha nenhum projeto que contem esse nome, cadastrado a este professor.");
        }
        
    }

     /*
     * Remove o projeto com o nome passado por parametro da lista de projetos do professor.
       * @param String com o nome do Projeto
       * @return void
     */
    public void removerProjeto(String nome) throws  ProjetoInexistenteException {
        boolean remocao = false;
        for(Projeto p : this.projetos){
             if(p.getNome().equals(nome)){
                 this.projetos.remove(p);
                 remocao = true;
             }
        }
        if (!remocao)
            throw new ProjetoInexistenteException("Nao ha nenhum projeto com este nome cadastrado a este professor.");
    }

  
    /**
     * Remove o Projeto passado por parametro da lista de projetos do professor.
     * @param instancia de Projeto
     * @return void
     */
    public void removerProjeto(Projeto p) throws ProjetoInexistenteException {
        
        if(projetos.contains(p)){
            this.projetos.remove(p);
        } else {
            throw new ProjetoInexistenteException("Este projeto não esta cadastrado para este professor");
        }
    }
    
    /**
     * Atualiza um projeto da lista de projetos.
     * @param pAtual Projeto a ser atualizado.
     * @param pModificado Projeto modificado.
     * @throws ProjetoInexistenteException
     * @throws AtualizacaoDeProjetoException 
     * @param Projeto que esta cadastrado atualmente, Projeto novo para substituir
     * o atual
     * @return void
     */
    public void atualizarProjeto(Projeto pAtual, Projeto pModificado) throws ProjetoInexistenteException {
        if((pAtual != null) && (pModificado != null)){
            if (projetos.contains(pAtual)){
                projetos.remove(pAtual);
                projetos.add(pModificado);
            } else {
                throw new ProjetoInexistenteException("O projeto que você deseja modeficar não esta cadastrado para este professor");
            }
        } 
//        else {
//            throw new AtualizacaoDeProjetoException("Ocorreu um erro ao tentar atualizar o projeto, verifique as informações e tente novamente");
//        }
    }
    /*
     * @return retorna uma string com os valores de todos os atributos do Professor.
     * @param null
     */
    public String toString() {
        String tmp = "";
        tmp += "Nome: " + this.nome + " Matrícula: " + this.matricula + " Telefone: " + this.telefone + "\nProjeto(s):\n";
        if (!projetos.isEmpty()) {
            for (Projeto projeto : projetos) {
                tmp += projeto.toString();
            }
        }
        return tmp;
    }
    
}
